//
//  HQL5_4ViewController.h
//  CoreAnimationDemo
//
//  Created by Qilin Hu on 2019/9/19.
//  Copyright © 2019 Tonintech. All rights reserved.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

/**
 视图透视
 */
@interface HQL5_4ViewController : UIViewController

@end

NS_ASSUME_NONNULL_END

/*
 # 视图透视
 
 在真实世界中，当物体远离我们的时候，由于视角的原因看起来会变小，理论上说远离我们的视图的边要比靠近视角的边更短，但实际上并没有发生，
 而我们当前的视角是等距离的（等距投影），也就是在 3D 变换中任然保持平行，和之前提到的仿射变换类似。
 
 为了做一些修正，我们需要引入投影变换（又称作 z 变换）来对除了旋转之外的变换矩阵做一些修改，Core Animation 并没有给我们提供设置透视变换的函数，因此我们需要手动修改矩阵值，幸运的是，很简单：
 CATransform3D 的透视效果通过一个矩阵中一个很简单的元素来控制：m34。m34 用于按比例缩放 X 和 Y 的值来计算到底要离视角多远。
 
 CATransform3D 矩阵：m11 m21 m31 m41
                    m12 m22 m32 m42
                    m13 m23 m33 m43
                    m14 m24 m34 m44
 
 m34 的默认值是 0，我们可以通过设置 m34 为 - 1.0 / d 来应用透视效果，
 d 代表了想象中视角相机和屏幕之间的距离，以像素为单位，那应该如何计算这个距离呢？实际上并不需要，大概估算一个就好了。

 因为视角相机实际上并不存在，所以可以根据屏幕上的显示效果自由决定它的防止的位置。通常 500-1000 就已经很好了，但对于特定的图层有时候更小后者更大的值会看起来更舒服，减少距离的值会增强透视效果，所以一个非常微小的值会让它看起来更加失真，然而一个非常大的值会让它基本失去透视效果。
 
 # 灭点
 
 当在透视角度绘图的时候，远离相机视角的物体将会变小变远，当远离到一个极限距离，它们可能就缩成了一个点，于是所有的物体最后都汇聚消失在同一个点。
 在现实中，这个点通常是视图的中心，于是为了在应用中创建拟真效果的透视，这个点应该聚在屏幕中点，或者至少是包含所有 3D 对象的视图中点。
 
 Core Animation 定义了这个点位于变换图层的 anchorPoint。
 这就是说，当图层发生变换时，这个点永远位于图层变换之前 anchorPoint 的位置。
 
 当改变一个图层的 position，你也改变了它的灭点，做 3D 变换的时候要时刻记住这一点。
 当你视图通过调整 m34 来让它更加有 3D 效果，应该首先把它放置于屏幕中央，然后通过平移来把它移动到指定位置（而不是直接改变它的 position），这样所有的 3D 图层都共享一个灭点。
 
 
 # 背面
 
 我们既然可以在 3D 场景下旋转图层，那么也可以从背面去观察它。如果我们在清单 5.4 中把角度修改为 M_PI（180 度）而不是当前的 M_PI_4（45 度），那么将会把图层完全旋转一个半圈，于是完全背对了相机视角。
 
 如你所见，图层是双面绘制的，反面显示的是正面的一个镜像图片。
 
 CALayer 有一个叫做 doubleSided 的属性来控制图层的背面是否要被绘制。
 这是一个 BOOL 类型，默认为 YES，如果设置为 NO，那么当图层正面从相机视角消失的时候，它将不会被绘制。
 
 
 
 */
